#!/usr/bin/env bash

# shellcheck source=bin/_config.sh
source "$(dirname "${BASH_SOURCE[0]}")/_config.sh"

declare prompt
declare -a sites
declare -i default=1
declare -i choice
declare -i n_sites
declare -a databases=("postgresql" "mysql" "sqlite")
# Note that the ports respect the sequence of the databases
# list, which means that it is necessary to identify the port
# in accordance with the position of the database name
declare -a databases_ports=("5472" "3306" "")
declare -i database_choice
declare -i n_databases
declare -A languages=(
    ["Portuguese"]='("pt", "Portuguese")'
    ["French"]='("fr", "French (France)")'
    ["Spanish"]='("es", "Spanish")'
    ["Russian"]='("ru", "Russian")'
    ["Vietnamese"]='("vi", "Vietnamese")'
    ["Arabic (Saudi Arabia)"]='("ar", "Arabic (Saudi Arabia)")'
    ["Korean"]='("ko", "Korean")'
)
declare -A selected_languages=(
    ["English"]='("en", "English")'
)
ordered_languages=(
    "English"
    "Portuguese (Portugal)"
    "French (France)"
    "Spanish"
    "Russian"
    "Vietnamese"
    "Arabic (Saudi Arabia)"
    "Korean"
)
ordered_languages_choices=""

# List sites by looking in the "sites" directory
# and store them in an array
read -r -a sites <<< "$(
    find "${SITES_DIRECTORY}" -maxdepth 1 -mindepth 1  -type d |
    sed 's|'"${SITES_DIRECTORY}\/"'||' |
    xargs
)"
n_sites=${#sites[@]}
n_databases=${#databases[@]}

if [[ n_sites -eq 0 ]]; then
    (>&2 echo "You should first add a site to the project by running: make add-site")
    exit 10
fi

if [[ n_sites -eq 1 ]]; then
    # If there is only one site, activate it
    echo "RICHIE_SITE=${sites[0]}" > .env
else
    prompt="Select an available site to activate:\\n"
    for (( i=0; i<n_sites; i++ )); do
        prompt+="[$((i+1))] ${sites[$i]}"
        if [[ $((i+1)) -eq ${default} ]]; then
            prompt+=" (default)"
        fi
        prompt+="\\n"
    done
    prompt+="Your choice: "
    read -r -p "$(echo -e "${prompt}")" choice

    if [[ ${choice} -gt n_sites ]]; then
        (>&2 echo "Invalid choice ${choice} (should be <= ${n_sites})")
        exit 10
    fi

    if [[ ${choice} -le 0 ]]; then
        choice=${default}
    fi
fi

prompt="Select an available database to activate:\\n"
for (( i=0; i<n_databases; i++ )); do
    prompt+="[$((i+1))] ${databases[$i]}"
    if [[ $((i+1)) -eq ${default} ]]; then
        prompt+=" (default)"
    fi
    prompt+="\\n"
done
prompt+="Your choice: "
read -r -p "$(echo -e "${prompt}")" database_choice

if [[ ${database_choice} -le 0 ]]; then
    database_choice=${default}
fi

while true; do
    echo "Do you want to set up languages for this site? (y/n)"
    read -r setup_languages
    if [[ "$setup_languages" != "y" && "$setup_languages" != "n" ]]; then
        echo "Please enter 'y' or 'n'."
    else
        if [[ "$setup_languages" != "y" ]]; then
            echo "Skipping language setup."
            break
        else
            echo "Select the languages this site will support:"
            for language in "${!languages[@]}"; do
                while true; do
                    read -p "Enable $language? (y/n): " answer
                    if [[ "$answer" != "y" && "$answer" != "n" ]]; then
                        echo "Please enter 'y' or 'n'."
                    else
                        if [[ "$answer" == "y" ]]; then
                            selected_languages["$language"]="${languages["$language"]}"
                        fi
                        break
                    fi
                done
            done

            for language in "${ordered_languages[@]}"; do
                if [[ -n "${selected_languages["$language"]}" ]]; then
                    if [[ -z $ordered_languages_choices ]]; then
                        ordered_languages_choices="${selected_languages["$language"]}"
                    else
                        ordered_languages_choices="$ordered_languages_choices, ${selected_languages["$language"]}"
                    fi
                fi
            done
            break
        fi
    fi
done

# Activate the chosen site
# Set the database and port
echo "RICHIE_SITE=${sites[$((choice-1))]}" > .env
echo "ACTIVATED_DB=${databases[$((database_choice-1))]}" >> .env
echo "DB_PORT=${databases_ports[$((database_choice-1))]}" >> .env

if [[ "$setup_languages" == "y" ]]; then
    # Set the LANGUAGES variables in the .env file
    echo "LANGUAGES=($ordered_languages_choices)" >> .env
    break
fi

echo """
Site activated successfully!

The configurations are set in the .env file

Please, if you set up languages, note that  you
can change the languages order in the .env file
according to your needs. English is the default
language and if the site will not suport it, you
can remove it from there.
"""